import NotifiUtil from '@/common/notification.js'
/**
 * 调用方式 this.$ckeckUpdate();
 * @param {Object} Vue
 * @param {Object} option
 */
exports.install = function(Vue, option) {

    /**
     * 检查更新的方法
     */
    Vue.prototype.$ckeckUpdate = function() {
        console.log('[信息]正在检查更新...')
        let _this = this;
        // #ifndef H5
        _this.$syncVersion();
        _this.$autoSyncAppVersionId();
        setTimeout(function() {
            getUpdateInfo(_this);
        }, 2000)
        // #endif
    }

    /**
     * 查询更新信息
     */
    function getUpdateInfo(_this) {
        let appVersion = uni.getStorageSync('appVersion');
        let sendParams = {
            appid: appVersion.appid,
            // versionCode: appVersion.versionCode,
            osName: appVersion.osName,
            status: 0,
            orderBy: 'a.version_code desc'
        }
        let url = 'http://www.anlinxi.top:38982/jeesite4/mobile/app_version_control/appVersion/update'
        console.log('[信息]检查更新发送参数', url, sendParams)
        updatePost(
            url, sendParams,
            function(result) {
                if (result.code == 200) {
                    console.log('[信息]app升级版本信息', result.result)
                    let appUrl = result.result.downloadUrl
                    let newVersionCode = result.result.versionCode
                    if (appVersion.versionCode < newVersionCode) {
                        uni.showToast({
                            title: '您当前的版本[' + appVersion.versionCode + ']需要升级[' + newVersionCode +
                                ']..',
                            icon: 'none',
                            success: function() {
                                setTimeout(function() {
                                    _this.$nowUpdate(appUrl)
                                }, 1000)
                            }
                        });
                    } else if (appVersion.versionCode > newVersionCode) {
                        uni.showToast({
                            title: '您的App是未来的版本..',
                            icon: 'none'
                        });
                    }

                } else {
                    console.log('[警告]app升级查询失败:', result)
                    uni.showToast({
                        title: result.message,
                        icon: 'none'
                    });
                }
            }
        );
    }

    /**
     * 开始更新app
     * @param {Object} appUrl
     */
    Vue.prototype.$nowUpdate = function(appUrl) {
        console.log('%c [信息]下载地址:' + appUrl, 'color:#1c42ee');
        // 判断系统类型
        // #ifdef APP-PLUS
        if (plus.os.name.toLowerCase() === 'android') {
            if (appUrl && appUrl !== '#') {
                // 我这里默认#也是没有地址，请根据业务自行修改
                // 安卓：创建下载任务
                this.$createTask(appUrl);
            } else {
                this.showToast('未找到下载地址');
            }
        } else {
            if (appUrl && appUrl !== '#') {
                // 我这里默认#也是没有地址，请根据业务自行修改
                // 苹果(A)：进行热更新（如果iosLink是wgt更新包的下载地址）判断文件名中是否含有.wgt
                if (appUrl.match(RegExp(/.wgt/))) {
                    this.$createTask(appUrl);
                } else {
                    // 苹果(B)：打开商店链接（如果iosLink是苹果商店的地址）
                    plus.runtime.openURL(appUrl);
                }
            } else {
                this.showToast('未找到ios商店地址');
            }
        }
        // #endif
    }

    /**
     * 创建下载链接
     * @param {Object} downloadUrl
     */
    Vue.prototype.$createTask = function(downloadUrl) {
        let _this = this;
        //判断是否已经存在任务 
        _this.downloadProgress = 0;
        _this.startProgress = true;
        let appVersion = uni.getStorageSync('appVersion');
        //通知实例创建
        _this.NotificationUtil = NotifiUtil();
        _this.NotificationUtil.setNotification(appVersion.description, "开始下载! ");
        console.log('[信息]下载地址:' + downloadUrl);
        // 创建下载任务对象
        _this.downloadTask = uni.downloadFile({
            url: downloadUrl,
            success: res => {
                if (res.statusCode === 200) {
                    _this.NotificationUtil.compProgressNotification(appVersion.description,
                        "下载完毕! ");
                    setTimeout(function() {
                        _this.NotificationUtil.clearNotification();
                    }, 3000)
                    // 保存下载的安装包
                    uni.saveFile({
                        tempFilePath: res.tempFilePath,
                        success: res => {
                            let packgePath = res.savedFilePath;
                            // 进行安装
                            _this.$installPackge(packgePath);
                            // 任务完成，关闭下载任务
                            _this.downloadTask.abort();
                            _this.downloadTask = null;
                            _this.startProgress = false;
                        }
                    });
                }
            }
        });
        // 进度条更新
        _this.downloadTask.onProgressUpdate(res => {
            // console.debug('[调试]进度条更新', res.progress)
            _this.NotificationUtil.setProgress(res.progress, appVersion.description + ' 正在更新', null,
                '正在下载更新包...');
            _this.downloadProgress = res.progress;
        });

    }

    /**
     * 安装更新包
     * @param {Object} packgePath
     */
    Vue.prototype.$installPackge = function(packgePath) {
        // #ifdef APP-PLUS
        let _this = this;
        // 安装更新
        uni.showLoading({
            title: '升级中...'
        });
        console.log('%c [升级]安装更新', 'color:#ff223f', packgePath);
        plus.runtime.install(
            packgePath, {
                force: true
            },
            function() {
                uni.hideLoading();
                console.log('[信息]更新成功...', packgePath, packgePath.match(RegExp(/.wgt/)));
                // 判断是否为热更新（判断文件名中是否含有.wgt）
                if (packgePath.match(RegExp(/.wgt/))) {
                    _this.$syncVersion();
                    uni.showModal({
                        title: '提示',
                        content: '应用将重启以完成更新[' + uni.getStorageSync('appVersion').versionCode + ']',
                        showCancel: false,
                        complete: () => {
                            plus.runtime.restart();
                        }
                    });
                }
            },
            function(e) {
                uni.hideLoading();
                console.error('[错误]更新失败...', e);
                uni.showToast({
                    title: '更新失败',
                    icon: 'none'
                });
            }
        );

        //保存更新记录到stroage，方便下次启动app时删除安装包
        uni.setStorage({
            key: 'updated',
            data: {
                completed: true,
                packgePath: packgePath
            },
            success: (res) => {
                console.log('成功保存更新记录')
            }
        })
        // #endif
    }

    /**
     * 同步本机版本号
     */
    Vue.prototype.$syncVersion = function() {
        // #ifdef APP-PLUS
        // 获取本地应用资源版本号
        plus.runtime.getProperty(plus.runtime.appid, function(inf) {
            console.log('当前应用版本：', inf);
            //注释下重要信息
            let appVersion = {
                version: inf.version,
                versionCode: inf.versionCode,
                appid: inf.appid,
                osName: plus.os.name.toLowerCase()
            }
            inf.osName = plus.os.name.toLowerCase()
            console.log('APP_VERSION：', inf.appid, appVersion.version, appVersion.versionCode, inf
                .osName);

            uni.setStorageSync('appVersion', inf);
        });
        // #endif
    }

    /**
     * 字段将app版本编码同步成为升级检测id
     */
    Vue.prototype.$autoSyncAppVersionId = function() {
        let appVersion = uni.getStorageSync('appVersion');
        if (appVersion) {
            let avc = appVersion.versionCode;
            let version = avc.replace(/\./g, '');
            console.log('%c [信息]APP_VERSION_ID=' + version + ';原CODE=' + avc, 'color:#d8c1ff');
            appVersion.version = version;
            uni.setStorageSync('appVersion', appVersion);
            return version;
        }
    }

    /**
     * 应用内部请求请求封装
     * @param {Object} url 请求地址
     * @param {Object} params 请求参数
     * @param {Object} backfunc 成功的回调
     * @param {Object} errfunc 失败的回调
     */
    function updatePost(url, params, backfunc, errfunc) {
        updateRequest(url, params, backfunc, errfunc, 'POST')
    }

    /**
     * 统一的请求方法
     * @param {Object} url 请求地址
     * @param {Object} params 请求参数
     * @param {Object} backfunc 成功的回调
     * @param {Object} errfunc 失败的回调
     * @param {Object} method GET/POST
     */
    function updateRequest(url, params, backfunc, errfunc, method) {
        const _this = this
        const sid = uni.getStorageSync('sid')
        const user = uni.getStorageSync('user')
        params.__ajax = 'json'
        uni.showLoading({
            title: '请等待...'
        });
        uni.request({
            url: url,
            method: method,
            timeout: 8000,
            header: {
                'content-type': 'application/json;charset=utf-8',
                '__userId': user.loginCode,
                '__sid': sid
            },
            data: params,
            complete: (res) => {
                uni.hideLoading();
            },
            success: (res) => {
                //正常调用业务地址，若返回 "result":"login" 则代表 __sid 会话已失效，需要重新登录，否则正常处理；
                if (res.statusCode == 200 && res.data != undefined && res.data.result == 'login') {
                    //若会话已失效，则重新调用 login 登录方法重新获取新的 _sid；
                    uni.removeStorageSync('user');
                    uni.removeStorageSync('sid');
                    try {
                        _this.$config.sid = ''
                        _this.$config.user = {}
                    } catch (e) {
                        //TODO handle the exception
                    }

                    uni.showToast({
                        title: '登录已超时，请重新登录!',
                        duration: 3000,
                        icon: 'none',
                        success: function() {
                            uni.navigateTo({
                                url: "/pages/login/login"
                            })
                        }
                    })
                }

                // 执行回调函数
                if (res.statusCode == 200) {
                    backfunc(res.data, res)
                } else {
                    errfunc(res, res.statusCode, url)
                }
            },
            fail: (data, code) => {
                console.warn('[警告]' + method + '请求失败:', data);
                if (errfunc) {
                    errfunc(data, code, url)
                }
            }
        });
    }

}
